Перейти к основному содержимому

Скрипты и таймеры для обслуживания Btrfs

Автоматизируйте регулярное обслуживание Btrfs при помощи скрипта и двух таймеров: еженедельная балансировка и ежемесячный scrub.

Скрипт /usr/local/sbin/btrfs-maintenance.sh

#!/usr/bin/env bash
set -euo pipefail
MOUNTPOINT="/"
IONICE="ionice -c3"
NICE="nice -n 19"

log() { echo "[btrfs-maintenance] $(date -Iseconds) $*"; }

# Лёгкая балансировка
log "Starting balance (-dusage=75 -musage=75) on ${MOUNTPOINT}"
${IONICE} ${NICE} btrfs balance start -dusage=75 -musage=75 ${MOUNTPOINT}

# По флагу выполняем scrub
if [[ "${1:-}" == "--scrub" ]]; then
log "Starting scrub on ${MOUNTPOINT}"
${IONICE} ${NICE} btrfs scrub start -B -d -R ${MOUNTPOINT}
fi

log "Done"

Сделайте исполняемым:

sudo install -Dm755 btrfs-maintenance.sh /usr/local/sbin/btrfs-maintenance.sh

Unit-файлы systemd

Служба балансировки /etc/systemd/system/btrfs-balance.service

[Unit]
Description=Weekly Btrfs light balance (NVMe/SSD/HDD-friendly)
After=local-fs.target
RequiresMountsFor=/

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/btrfs-maintenance.sh
Nice=19
IOSchedulingClass=idle
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
NoNewPrivileges=yes

Таймер балансировки /etc/systemd/system/btrfs-balance.timer

[Unit]
Description=Run Btrfs balance weekly

[Timer]
OnCalendar=Sun *-*-* 03:15:00
RandomizedDelaySec=1h
Persistent=true

[Install]
WantedBy=timers.target

Служба scrub /etc/systemd/system/btrfs-scrub.service

[Unit]
Description=Monthly Btrfs scrub (integrity check)
After=local-fs.target
RequiresMountsFor=/

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/btrfs-maintenance.sh --scrub
Nice=19
IOSchedulingClass=idle
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
NoNewPrivileges=yes

Таймер scrub /etc/systemd/system/btrfs-scrub.timer

[Unit]
Description=Run Btrfs scrub monthly

[Timer]
OnCalendar=monthly
AccuracySec=1h
RandomizedDelaySec=2h
Persistent=true

[Install]
WantedBy=timers.target

Активация и проверка

sudo systemctl daemon-reload
sudo systemctl enable --now btrfs-balance.timer btrfs-scrub.timer
systemctl list-timers | grep btrfs

Ручной запуск и логи

sudo systemctl start btrfs-balance.service
sudo systemctl start btrfs-scrub.service
sudo journalctl -u btrfs-balance.service -n 50 --no-pager
sudo journalctl -u btrfs-scrub.service -n 50 --no-pager

Кастомизация

  • Меняйте OnCalendar под свои окна простоя.
  • Для HDD сократите частоту балансировки (например, раз в месяц) и используйте меньшие пороги нагрузки.
  • Для интенсивных сборок можно временно убрать autodefrag на соответствующем subvolume.

Удаление

sudo systemctl disable --now btrfs-balance.timer btrfs-scrub.timer
sudo rm -f /etc/systemd/system/btrfs-balance.* /etc/systemd/system/btrfs-scrub.*
sudo systemctl daemon-reload